package com.helin.helinhealth.controller;

import com.helin.helinhealth.common.Result;
import com.helin.helinhealth.dto.AdminLoginRequest;
import com.helin.helinhealth.dto.AdminRegisterRequest;
import com.helin.helinhealth.entity.Admin;
import com.helin.helinhealth.service.AdminService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

/**
 * 管理员控制器
 * 
 * <p>
 * 该控制器处理后台管理系统的用户认证相关的HTTP请求，包括管理员登录、注册等。
 * 是后台管理系统的入口点，为Web端提供用户身份验证服务。
 * </p>
 */
@Slf4j
@Tag(name = "后台管理认证", description = "后台管理系统认证相关接口")
@RestController
@RequestMapping("/api/admin")
public class AdminController {

    /**
     * 管理员服务
     */
    @Autowired
    private AdminService adminService;

    /**
     * 管理员登录接口
     * 
     * <p>
     * 接收后台管理系统用户的登录请求，验证用户名和密码是否正确，
     * 如果正确则生成JWT令牌返回，同时返回用户基本信息。
     * </p>
     * 
     * @param loginRequest 登录请求DTO
     * @return 登录结果
     */
    @Operation(summary = "管理员登录", description = "通过用户名和密码登录后台管理系统")
    @PostMapping("/login")
    public Result login(@Valid @RequestBody AdminLoginRequest loginRequest) {
        try {
            log.info("管理员登录请求: {}", loginRequest.getUsername());
            
            // 调用管理员服务进行登录认证
            String token = adminService.login(loginRequest);
            
            // 获取用户信息
            Admin admin = adminService.getAdminByUsername(loginRequest.getUsername());
            
            // 组装返回结果
            Map<String, Object> resultMap = new HashMap<>();
            resultMap.put("token", token);
            
            // 移除敏感信息
            admin.setPassword(null);
            resultMap.put("userInfo", admin);
            
            return Result.success("登录成功", resultMap);
        } catch (Exception e) {
            log.error("管理员登录失败: {}", e.getMessage(), e);
            return Result.error("登录失败: " + e.getMessage());
        }
    }
    
    /**
     * 管理员注册接口
     * 
     * <p>
     * 接收后台管理系统用户的注册请求，验证用户信息是否合法，
     * 如果合法则创建新用户并返回注册结果。
     * </p>
     * 
     * @param registerRequest 注册请求DTO
     * @return 注册结果
     */
    @Operation(summary = "管理员注册", description = "注册新的后台管理系统用户")
    @PostMapping("/register")
    public Result register(@Valid @RequestBody AdminRegisterRequest registerRequest) {
        try {
            log.info("管理员注册请求: {}", registerRequest.getUsername());
            
            // 调用管理员服务进行注册
            Admin admin = adminService.register(registerRequest);
            
            return Result.success("注册成功", admin);
        } catch (Exception e) {
            log.error("管理员注册失败: {}", e.getMessage(), e);
            return Result.error("注册失败: " + e.getMessage());
        }
    }
} 